import configs from '@/config/config'
// 此vm参数为页面的实例，可以通过它引用vuex中的变量
// 需要忽略的提示。忽略后，自动 Promise.reject('error')
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		config.baseURL = configs.baseUrl; /* 根域名 */
		return config
	})
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		config.data = config.data || {}
		// 取缓存token
		config.header['Authorization'] = uni.getStorageSync("Authorization") || ''
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use(
		async res => {
				uni.stopPullDownRefresh()
				// 自定义处理【error 错误提示】：如果需要显示错误提示，则显示错误提示
				if (res.data.code !== 0) {
					// 特殊：如果 401 错误码，则跳转到登录页 or 刷新令牌
					// 特殊：如果 401 错误码，则跳转到登录页 or 刷新令牌
					if (res.data.code === 401) {
						uni.removeStorageSync('Authorization')
						uni.$u.toast('登录信息已失效')
						setTimeout(() => {
							uni.reLaunch({
								url: "/pages/index/index"
							})
						}, 1000)
					} else {
						uni.showToast({
							title: res.data.msg,
							icon: 'none',
							mask: true,
						});
					}

					// 错误提示
					if (res.config.custom.showError) {
						uni.showToast({
							title: res.data.msg || '服务器开小差啦,请稍后再试~',
							icon: 'none',
							mask: true,
						});
					}
				}

				// 自定义处理【showSuccess 成功提示】：如果需要显示成功提示，则显示成功提示
				if (res.config.custom.showSuccess &&
					res.config.custom.successMsg !== '' &&
					res.data.code === 0) {
					uni.showToast({
						title: res.config.custom.successMsg,
						icon: 'none',
					});
				}

				// 返回结果：包括 code + data + msg
				return Promise.resolve(res.data);
			},
			err => {
				let errorMessage = '网络请求出错';
				if (err !== undefined) {
					switch (err.statusCode) {
						case 400:
							errorMessage = '请求错误';
							break;
						case 401:
							errorMessage = '请先登录';
							// 正常情况下，后端不会返回 401 错误，所以这里不处理 handleAuthorized
							break;
						case 403:
							errorMessage = '拒绝访问';
							break;
						case 404:
							errorMessage = '请求出错';
							break;
						case 408:
							errorMessage = '请求超时';
							break;
						case 429:
							errorMessage = '请求频繁, 请稍后再访问';
							break;
						case 500:
							errorMessage = '服务器开小差啦,请稍后再试~';
							break;
						case 501:
							errorMessage = '服务未实现';
							break;
						case 502:
							errorMessage = '网络错误';
							break;
						case 503:
							errorMessage = '服务不可用';
							break;
						case 504:
							errorMessage = '网络超时';
							break;
						case 505:
							errorMessage = 'HTTP 版本不受支持';
							break;
					}
					if (err.errMsg.includes('timeout')) errorMessage = '请求超时';
				}

				if (err && err.config) {
					if (err.config.custom.showError === false) {
						uni.showToast({
							title: err.data?.msg || errorMessage,
							icon: 'none',
							mask: true,
						});
					}
					err.config.custom.showLoading && closeLoading();
				}

				return false;
			},
	)
}